package com.zhiyou.utils;

import java.util.Properties;

import org.joda.time.DateTime;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

@Component
public class FTPUtil {

	// 代表服务器的IP
	private static String HOST;
	// 服务器端口
	private static int PORT;
	// 服务器用户名
	private static String USER;
	// 服务器密码
	private static String PASSWORD;
	// 图片存放在服务器的哪一个目录
	private static String ROOTPATH;
	// 显示图片服务器网络访问地址
	private static String IMAGEURL;

	/**
	 * 读取属性文件
	 */
	static{
		try {
			// 创建属性文件
			Properties properties = new Properties();
			// 将读取的内容读取属性文件
			properties.load(FTPUtil.class.getResourceAsStream("/nginx.properties"));
			// 获取到其中的值，赋值给上面的常量
			HOST = properties.getProperty("HOST");
			PORT = Integer.valueOf(properties.getProperty("PORT"));
			USER = properties.getProperty("USER");
			PASSWORD = properties.getProperty("PASSWORD");
			ROOTPATH = properties.getProperty("ROOTPATH");
			IMAGEURL = properties.getProperty("IMAGEURL");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 获取连接
	 */
	private static ChannelSftp getChannelSftp() throws Exception {
		// 创建一个jsch对象
		JSch jSch = new JSch();
		// 通过jsch创建一个session对象
		Session session = jSch.getSession(USER, HOST, PORT);
		// 把密码传进去
		session.setPassword(PASSWORD);
		// 创建一个属性文件对象
		Properties sshConfig = new Properties();
		// 设置不需要严格检查ssh连接(密钥)
		sshConfig.put("StrictHostKeyChecking", "no");
		// 把创建的属性文件对象放进session中
		session.setConfig(sshConfig);
		// 应用session，更改之后生效
		session.connect();
		// 通过ssh连接获取一个与服务器会话的通道(sftp)
		Channel channel = session.openChannel("sftp");
		// 连接
		channel.connect();
		// 返回
		return (ChannelSftp) channel;
	}

	/**
	 * ftp上传图片
	 */
	public static String setImage(MultipartFile file) {
		try {
			// 尽量避免图片重名，可以用一个0~9999的随机数拼接一个时间戳和原本名字的后缀，生成新的文件名称
			String originalFilename = file.getOriginalFilename();
			String imgName = Integer.toString((int) (Math.random() * 9999));
			imgName += Long.toString(System.currentTimeMillis());
			// 截取原本的名字，留取后缀
			imgName += originalFilename.substring(originalFilename.lastIndexOf("."));

			// 设置文件需要存放咋服务器的子目录
			// 获取当前日期的年月日
			String filePath = new DateTime().toString("/yyyyMMdd/") + "group1/";
			// 服务器路径+子目录的最终文件路径
			String path = ROOTPATH + filePath + "/";
			// 获取ChannelSftp
			ChannelSftp sftp = getChannelSftp();
			// 创建文件
			createDir(path, sftp);
			// 上传文件
			sftp.put(file.getInputStream(), path + imgName);
			// sftp.rm(path+imgName);删除
			// 退出
			sftp.quit();
			sftp.exit();
			return IMAGEURL + filePath + imgName;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * ftp删除图片
	 */
	public static String rmImage(String path) {
		if (path != null&&path.length()>25) { // 判断是否为空
			try {
				// 获取ChannelSftp
				ChannelSftp sftp = getChannelSftp();
				// 根据路径获取到文件夹和文件
				String rmPath = ROOTPATH + path.substring(25);
				sftp.rm(rmPath);
				// 退出
				sftp.quit();
				sftp.exit();
				return "成功";
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;
	}

	/**
	 * 创建服务器下的文件存放的子目录 将/usr/xx/xx/xx/xx/ 将路径拆分成字符串数组，然后通过cd命令一级一级的目录进入，如果进不去就创建
	 * 
	 * @throws SftpException
	 */
	public static void createDir(String path, ChannelSftp sftp) throws SftpException {
		// 通过/分割成一个数组
		String[] split = path.split("/");
		// 进入到跟目录下
		try {
			sftp.cd("/");
		} catch (SftpException e1) {
			e1.printStackTrace();
		}
		// 从根目录往里一个一个进，如果进不去，就创建
		for (String string : split) {
			if (string.length() > 0) {// 确定有这个目录字符串
				try {
					sftp.cd(string);
				} catch (SftpException e) {
					// 进入这里，说明没有这个目录，创建这个目录
					sftp.mkdir(string);
					sftp.cd(string);
				}
			}
		}
	}
}
